﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Modele
{
    [Serializable]
    public class Piste
    {
        public enum Clee { Sol, Fa, Ut };

        [XmlElement(ElementName = "Armature")]
        public List<Note> armature = new List<Note>();

        [XmlElement(ElementName = "Name")]
        public String name;

        [XmlElement(ElementName = "Mesure")]
        public List<Mesure> mesures=new List<Mesure> ();

        [XmlAttribute("Clee")]
        public Clee clef= Clee.Sol;

         [XmlAttribute("NbTemps")]
        public int nbTemps=4;

         [XmlAttribute("UnitTemps")]
        public int uniteTemps=4;

        
        [XmlElement(ElementName = "Tablature")]
        public Tablature tablature= new Tablature();

       

        
        /* Répétition d'une séléction de mesures */
        [Serializable]
        public class RepetitionMesure
        {
            /* Début de la répétition*/
            [XmlAttribute("Debut")]
            public int debut=0;
            /* Fin de la répétition */
            [XmlAttribute("Fin")]
            public int fin=0;
            /* Nombre de répétition */
            [XmlAttribute("NbRepet")]
            public int nbRepet=0;
        };

        [XmlElement(ElementName = "RepetMesure")]
        public List <RepetitionMesure> repetitionMesure=new List <RepetitionMesure> ();

        /*Attribut de gestion du son (namespace différent du modéle de préférence )*/

        /* Permet de définir une piste en mp3 */
        [XmlAttribute("Mp3")]
        public string mp3;

        [XmlAttribute("Volume")]
        public int volume=100;

        [XmlAttribute("Pan")] 
        public int pan=50; // Gére le panoramisme (droite gauche)

        [XmlElement(ElementName = "Instrument")]
        public Instrument instrument = new Instrument();


        public Piste()
        {                      
          
        }

        public Piste(Clee clef, int nbTemps, int uniteTemps, Instrument instrument)
        {
            this.clef = clef;
            this.nbTemps = nbTemps;
            this.uniteTemps = uniteTemps;
            this.instrument = instrument;
        }

       

        public void repeterMesure(int debut, int fin, int nbRepet)
        {
            RepetitionMesure tmp= new RepetitionMesure();
            tmp.debut = debut;
            tmp.fin = fin;
            tmp.nbRepet = nbRepet;
            repetitionMesure.Add(tmp);
           
        }

        /* Cette méthode permet d'assigner un emplacement sur la tablature à une note classique 
         * IMPORTANT : il faudra choisir une heuristique dans l'algorithme pour choisir
         * l'emplacement le plus adapté
         */
        public void trouverNoteTablature(Note n, Tablature tab)
        {
          
            /* On cherche la note sur la tablature courante */
            
            for (int i = 0; i < tab.notePossible.Count;i++ )
            {
              //  Console.WriteLine("-----:" + tab.notePossible[i].note.ToString() + "OCT:" + tab.notePossible[i].octave + "NUMCORD:" + tab.notePossible[i].tablatureInfos.numCorde + "NUMCAS:" + tab.notePossible[i].tablatureInfos.numCase);
                // LA note doit correspondre
                if (tab.notePossible[i].octave == n.octave)
                {
                    /* important, il faut gérer les équivalences de note :
                     * mib, re#/do# reb /fa# solb/sol# lab/la# sib/
                     * 
                     */
                    if (tab.notePossible[i].note.Equals(n.note))
                    {
                        if (tab.notePossible[i].alteration.Equals(n.alteration))
                        {                            
                            // On assigne le résultat à la note 
                            n.tablatureInfos.numCorde = tab.notePossible[i].tablatureInfos.numCorde;
                            n.tablatureInfos.numCase = tab.notePossible[i].tablatureInfos.numCase;
                            break;

                        }
                    }
                }
            }
          
        }
      
      }
}
